package cn.iocoder.yudao.module.reading.dal.mysql.recommendation;

import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.reading.dal.dataobject.recommendation.RecommendationZoneItemDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 推荐专区内容 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface RecommendationZoneItemMapper extends BaseMapperX<RecommendationZoneItemDO> {

    /**
     * 根据专区ID查询推荐内容列表
     *
     * @param zoneId      专区ID
     * @param contentType 内容类型（可选）
     * @param limit       限制数量
     * @return 推荐内容列表
     */
    default List<RecommendationZoneItemDO> selectByZoneId(Long zoneId, String contentType, Integer limit) {
        return selectList(new LambdaQueryWrapperX<RecommendationZoneItemDO>()
                .eq(RecommendationZoneItemDO::getZoneId, zoneId)
                .eq(RecommendationZoneItemDO::getEnabled, true)
                .eqIfPresent(RecommendationZoneItemDO::getContentType, contentType)
                .orderByDesc(RecommendationZoneItemDO::getIsTop)
                .orderByAsc(RecommendationZoneItemDO::getSortOrder)
                .orderByDesc(RecommendationZoneItemDO::getCreateTime)
                .last(limit != null ? "LIMIT " + limit : ""));
    }

    /**
     * 根据专区ID列表查询推荐内容
     *
     * @param zoneIds 专区ID列表
     * @return 推荐内容列表
     */
    default List<RecommendationZoneItemDO> selectByZoneIds(List<Long> zoneIds) {
        return selectList(new LambdaQueryWrapperX<RecommendationZoneItemDO>()
                .in(RecommendationZoneItemDO::getZoneId, zoneIds)
                .eq(RecommendationZoneItemDO::getEnabled, true)
                .orderByAsc(RecommendationZoneItemDO::getZoneId)
                .orderByDesc(RecommendationZoneItemDO::getIsTop)
                .orderByAsc(RecommendationZoneItemDO::getSortOrder));
    }

    /**
     * 根据内容类型和内容ID查询推荐记录
     *
     * @param contentType 内容类型
     * @param contentId   内容ID
     * @return 推荐记录列表
     */
    default List<RecommendationZoneItemDO> selectByContent(String contentType, Long contentId) {
        return selectList(new LambdaQueryWrapperX<RecommendationZoneItemDO>()
                .eq(RecommendationZoneItemDO::getContentType, contentType)
                .eq(RecommendationZoneItemDO::getContentId, contentId)
                .eq(RecommendationZoneItemDO::getEnabled, true));
    }

    /**
     * 根据专区ID删除推荐内容
     *
     * @param zoneId 专区ID
     * @return 删除数量
     */
    default int deleteByZoneId(Long zoneId) {
        return delete(RecommendationZoneItemDO::getZoneId, zoneId);
    }

}
